package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import vista.RegistrarOrden;
import vista.RegistrarOrdenModeloTablaPed;

import modelo.Cliente;
import modelo.ClienteDAO;
import modelo.Ingrediente;
import modelo.IngredienteDAO;
import modelo.Orden;
import modelo.OrdenDAO;
import modelo.Producto;
import modelo.ProductoDAO;


public class ControladorRegistrarOrden implements ActionListener {

	private RegistrarOrden registrarOrden;
	private List<Orden> ordenesCli; 
	private List<Ingrediente> ingredientesRespaldo;

	public ControladorRegistrarOrden() {
		super();
		this.registrarOrden = new RegistrarOrden();
		this.registrarOrden.addListener(this);
		this.registrarOrden.setVisible(true);
		this.registrarOrden.setLocationRelativeTo(null);	
		this.ordenesCli = new ArrayList<Orden>();
		this.ingredientesRespaldo = new ArrayList<Ingrediente>();
		limpiarCampos();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Aceptar")){
			registrarOrden();
		}
		else if (e.getActionCommand().equals("AgregarPedido")){
			agregarPedidos();
		}
		else if(e.getActionCommand().equals("QuitarPedido")){
			quitarPedido();
		}
		else if (e.getActionCommand().equals("Buscar")){
			buscarCliente();
		}
		else if (e.getActionCommand().equals("Nuevo")){
			limpiarCampos();
		}else if (e.getActionCommand().equals("Salir")){
			registrarOrden.dispose();
			actualizacionIngredientes(ingredientesRespaldo);
			
		}
	}
	public void registrarOrden(){
		try{
			if (!ordenesCli.isEmpty()){
				
				for(int i=0;i<ordenesCli.size();i++){
				ClienteDAO clienteDAO = new ClienteDAO();
				Date fecha = new Date();
				Cliente cliente = clienteDAO.getClientePorCedula(Long.parseLong(registrarOrden.getCedula()));
				if (cliente==null){
					cliente = new Cliente();
					cliente.setCedula(Long.parseLong(registrarOrden.getCedula()));
					cliente.setNombre(registrarOrden.getNombreCliente());
					clienteDAO.incluirCliente(cliente);
					}
				Orden orden = ordenesCli.get(i);
				orden.setCliente(cliente);
				orden.setFecha(fecha);
				orden.setFecha(fecha);
				OrdenDAO ordenDAO = new OrdenDAO();
				ordenDAO.incluirOrden(orden);
			
				registrarOrden.mostratMensaje("Registrado");
				limpiarCampos();
				}
			}
			else registrarOrden.mostratMensaje("Debe agregar pedidos");
		}catch (Exception e){
			registrarOrden.mostratMensaje("Chequee Campos");		}
	}
	public void limpiarCampos(){
		IngredienteDAO ingredienteDAO = new IngredienteDAO();
		ingredientesRespaldo = ingredienteDAO.consultarIngredientes();
		registrarOrden.setCmbProductos(arreProductos());
		registrarOrden.setTxtCantidad("");
		registrarOrden.setCedula("");
		registrarOrden.setNombreCliente("");
		registrarOrden.setNro("");
		registrarOrden.setTotal("");
		ordenesCli.clear();
		registrarOrden.setTablaPedidos(new RegistrarOrdenModeloTablaPed(ordenesCli));
	}
	public void actualizacionIngredientes(List<Ingrediente> lista){
		for(int i= 0;i<lista.size();i++){
			Ingrediente ingrediente = lista.get(i);
			IngredienteDAO ingredienteDAO = new IngredienteDAO();
			ingredienteDAO.actualizarIngrediente(ingrediente);
		}
	}
	public void agregarPedidos(){
		try{
		ProductoDAO productoDAO = new ProductoDAO();
		Producto producto = productoDAO.getProductoPorNombre(registrarOrden.getCmbProductos());
		float cant = new Float(registrarOrden.getTxtCantidad());
		Orden orden = new Orden();
		orden.setProducto(producto);
		orden.setCantidad(cant);
		boolean verificar=false;
		IngredienteDAO ingredienteDAO = new IngredienteDAO();
		List<Ingrediente> listaRespIngredientes = ingredienteDAO.consultarIngredientes();
		for (int i=0;i<producto.getIngredientes().size();i++){
			if ((producto.getIngredientes().get(i).existencia)>(orden.getCantidad()*producto.getIngredientes().get(i).getCantidad())){
				IngredienteDAO ingrdienteDAO = new IngredienteDAO();
				producto.getIngredientes().get(i).setExistencia(producto.getIngredientes().get(i).getExistencia()-(orden.getCantidad()*producto.getIngredientes().get(i).getCantidad()));
				verificar = true;
			}
			else {verificar = false; i = producto.getIngredientes().size();}
		}
		if (verificar){
			actualizacionIngredientes(producto.getIngredientes());
			ordenesCli.add(orden);
			registrarOrden.setTablaPedidos(new RegistrarOrdenModeloTablaPed(ordenesCli));
			registrarOrden.setTotal(String.valueOf(montoTotal()));
			registrarOrden.setCmbProductos(arreProductos());
			registrarOrden.setTxtCantidad("");
		}
		else registrarOrden.mostratMensaje("Ingredientes NO suficientes");
		}catch (NumberFormatException e){
			registrarOrden.mostratMensaje("Cantidad debe ser Numerica");
		}catch (Exception e){
			registrarOrden.mostratMensaje(e.toString());
		}
	}
	public void quitarPedido(){
		try{
			int nro = (Integer.parseInt(registrarOrden.getNro())-1);
				if (nro<ordenesCli.size()){
						
						Orden orden = ordenesCli.get(nro);
						for (int j=0;j<orden.getProducto().getIngredientes().size();j++){
							IngredienteDAO ingredienteDAO = new IngredienteDAO();
							orden.getProducto().getIngredientes().get(j).setExistencia((orden.getProducto().getIngredientes().get(j).getExistencia())+(orden.getCantidad()*orden.getProducto().getIngredientes().get(j).getCantidad()));
							ingredienteDAO.actualizarIngrediente(orden.getProducto().getIngredientes().get(j));	
						}
					ordenesCli.remove(nro);
				}
				else registrarOrden.mostratMensaje("No esta en la lista");
		}catch(NumberFormatException e) {
			registrarOrden.mostratMensaje("Nro. debe ser numerico");
		}catch (Exception e){
			registrarOrden.mostratMensaje("Nro invalido");
		}
		registrarOrden.setTotal(String.valueOf(montoTotal()));
		registrarOrden.setNro("");
		registrarOrden.setCmbProductos(arreProductos());
		registrarOrden.setTablaPedidos(new RegistrarOrdenModeloTablaPed(ordenesCli));
	}
	public String[] arreProductos(){
		ProductoDAO productoDAO = new ProductoDAO();
		List<Producto> productos = productoDAO.consultarProductos();
		int longitud = productoDAO.tamañoTabla();
		String[] arreProductos = new String[(longitud+1)];
		arreProductos[0]="--";
		int j=1;
		for (int i=0;i<productos.size();i++){
			Producto producto = new Producto();
			producto = productos.get(i);
			if (producto.getEstatus().equals("A")){
				arreProductos[j]=producto.getNombre();
				j++;
			}
		}
		return arreProductos;
	}
	public double montoTotal(){
		double montoTotal = 0;
		for (int i=0; i<ordenesCli.size();i++){
			Orden orden= ordenesCli.get(i);
			montoTotal = (montoTotal + orden.getMonto());
		}
		return montoTotal;
	}
	public void buscarCliente(){
		try {
			ClienteDAO clienteDAO = new ClienteDAO();
			Cliente cliente = clienteDAO.getClientePorCedula(Long.parseLong(registrarOrden.getCedula()));
			if (cliente!=null){
				registrarOrden.setNombreCliente(cliente.getNombre());
			}
			else registrarOrden.mostratMensaje("No Existe");
		}catch (NumberFormatException e){
			registrarOrden.mostratMensaje("cedula debe ser un dato numérico");
		}
	}     
}
